赞
踩
当 list1 和 list2 都不是空链表时,判断 list1 和 list2 哪一个链表的头节点的值更小,将较小值的节点添加到结果里,当一个节点被添加到结果里之后,将对应链表中的节点向后移一位。
首先,我们设定一个虚拟节点 dummy ,这可以在让我们比较容易地返回合并后的链表。我们维护一个 cur 指针,我们需要做的是调整它的 next 指针。然后重复以下过程,直到 list1 或者 list2 指向了 nullptr:
在循环终止的时候, list1 和 list2 至多有一个是非空的。由于输入的两个链表都是有序的,所以不管哪个链表是非空的,它包含的所有元素都比前面已经合并链表中的所有元素都要大。这意味着我们只需要简单地将非空链表接在合并链表的后面,并返回合并链表即可。
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) { ListNode *dummy = new ListNode(), *cur = dummy; if(!list1 || !list2) return list1 ? list1 : list2; while(list1 && list2){ if(list1->val <= list2->val){ cur->next = list1; list1 = list1->next; } else{ cur->next = list2; list2 = list2->next; } cur = cur->next; } if(!list1 || !list2) cur->next = list1 ? list1 : list2; return dummy->next; } };
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) { if(!list1 || !list2) return list1 ? list1 : list2; // 如果list1的第一个节点较小,那么最终返回以list1开头的链表 if(list1->val <= list2->val){ list1->next = mergeTwoLists(list1->next, list2); } // 如果list2的第一个节点较小,那么最终返回以list1开头的链表 else{ list2->next = mergeTwoLists(list1, list2->next); return list2; } return list1; } };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。