剑指offer - 合并两个排序的链表

题目

https://www.nowcoder.com/questionTerminal/d8b6b4358f774294a89de2a6ac4d9337

题意

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

题解

一种方法就是新建一条链表,依次按照顺序将两条链表中的点加上去,当然这回花费O(N)的空间。
也可以不用这O(N)的空间,用原有的链条,改变指针指向,是的两条链表连成一条,也就是,将一条链表插入另一条链表。

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
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
if(pHead1==NULL) return pHead2;
if(pHead2==NULL) return pHead1;
ListNode * p1 = pHead1,*p2 = pHead2;
//使得p1的第一个元素小于p2的第一个元素
if(p1->val > p2->val){
swap(p1,p2);
swap(pHead1,pHead2);
}

ListNode * pre;
while(p1&&p2){
while(p1&&p1->val <= p2->val){
pre=p1;
p1=p1->next;
}
pre->next=p2;
if(p1==NULL) break;
while(p2&&p2->val <= p1->val){
pre=p2;
p2=p2->next;
}
pre->next=p1;
}
if(p2)
pre->next=p2;
return pHead1;
}
};