题目
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
思路一
- 创建一个dummyHead, 如果l1和l2都不为空,则循环将最小的接在dummyHead后面。
- 如果有一个为空,则把另一个接在dummyHead尾结点后面。
代码一
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode* dummyHead = new ListNode( 0 );
ListNode* p = dummyHead;
while ( l1 && l2 ) {
if ( l1->val < l2->val ) {
p->next = l1;
l1 = l1->next;
}
else {
p->next = l2;
l2 = l2->next;
}
p = p->next;
}
p->next = l1 ? l1 : l2;
return dummyHead->next;
}
};
思路二
- 每次找到一个连续的较小的链表区间接到dummyHead的尾部
代码2
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode* dummyHead = new ListNode( 0 );
ListNode* p = dummyHead;
while ( l1 && l2 ) {
ListNode* temp = l1;
ListNode* pre = nullptr;
while ( l1 && l1->val <= l2->val ) {
pre = l1;
l1 = l1->next;
}
p->next = temp;
if ( pre ) // 如果pre为null,说明l1第一个元素小于l2第一个元素。
p = pre;
temp = l1;
l1 = l2;
l2 = temp;
}
p->next = l1 ? l1 : l2;
return dummyHead->next;
}
};