剑指offer——25. 合并两个排序的链表

25. 合并两个排序的链表

NowCoder

题目描述


解题思路

递归

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/

#if 1 //迭代实现
class Solution {
public:
ListNode* merge(ListNode* l1, ListNode* l2) {
//边界 z保证以下都合法
if(!l1) return l2;
if(!l2) return l1;
//创建一个用于返回的节点
ListNode* conn = new ListNode(0);
ListNode* tmp = conn; //跟踪
ListNode* p1 = l1, *p2 = l2; //跟踪

while(p1 && p2) //公共区域
{
if(p1->val < p2->val)
{
tmp->next = p1;
p1 = p1->next;
}
else
{
tmp->next = p2;
p2 = p2->next;
}
tmp = tmp->next;
}

tmp->next = (p1) ? p1 : p2;
return conn->next;
}
};
#endif

迭代

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public:
ListNode* merge(ListNode* l1, ListNode* l2) {
//边界 z保证以下都合法
if(!l1) return l2;
if(!l2) return l1;
ListNode* conn = nullptr;
if(l1->val < l2->val)
{
conn = l1;
conn->next = merge(l1->next, l2);
}
else
{
conn = l2;
conn->next = merge(l1, l2->next);
}
return conn;
}
};
创作不易,欢迎打赏!
-------------本文结束感谢您的阅读-------------