前面我们说过合并两个有序数组,这里我们来说说合并两个有序链表。
难度 简单 OJ链接
思路:
每次取小的,尾插到新链表。
我们定义一个tail来记录尾节点,这样我们就不需要找尾。
结束条件:当有一个链表为空时,就结束循环。然后把另外一个链表直接连接到后面就行了。
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
//如果一个链表为NULL,就返回另外的一个链表
if (list1 == NULL)
return list2;
if (list2 == NULL)
return list1;
struct ListNode* head = NULL, * tail = NULL;
//两个链表都不为NULL
while (list1 && list2)
{
if (list1->val < list2->val)
{
if (tail == NULL)
{
head = tail = list1;
}
else
{
tail->next = list1;
tail = list1;
}
list1 = list1->next;//找下一个节点
}
else
{
if (tail == NULL)
{
head = tail = list2;
}
else
{
tail->next = list2;
tail = list2;
}
list2 = list2->next;//找下一个节点
}
}
//结束时,如果有一个链表不为空,就直接连接后面的节点
if (list1)
{
tail->next = list1;
}
if (list2)
{
tail->next = list2;
}
return head;
}
我们再说一种写法:我们用带哨兵位节点来做。
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
struct ListNode* head = NULL, * tail = NULL;
//定义一个哨兵位的节点
head=tail=(struct ListNode*)malloc(sizeof(struct ListNode));
head->next=NULL;
while (list1 && list2)
{
if (list1->val < list2->val)
{
tail->next = list1;
tail = list1;
list1 = list1->next;
}
else
{
tail->next = list2;
tail = list2;
list2 = list2->next;
}
}
if (list1)
{
tail->next = list1;
}
if (list2)
{
tail->next = list2;
}
//释放空间,防止内存泄漏
struct ListNode* list=head->next;
free(head);
return list;
}
定义一个哨兵位的节点,我们就不需要顾及是不是为NULL了,因为现在tail是有值的了,直接连接在后面就行了。
难度 简单 OJ链接
这里,我先举一个例子:
假设x为4,我们把小于4的放在前面,但相对位置不变。
解题思路:
遍历原链表:1.把<x的插入链表1。
2.把>=x的插入链表2。
3.连接链表1和链表2。
当我们连接结束后,我们把lessHead和greaterHead给free掉。
但是,到这里并没有结束,程序还有问题。
有时候,我们做题时需要考虑一些极端的情况。
这里第4种情况我们要考虑一下:
如果是这样就会有些问题:
它会形成带环问题,所以最后我们要处理一下,将greaterTail->next置为NULL。
代码如下:
ListNode* partition(ListNode* pHead, int x) {
struct ListNode *lessHead,*lessTail,*greaterHead,*greaterTail;
lessHead=lessTail=(struct ListNode*)malloc(sizeof(struct ListNode));
greaterHead=greaterTail=(struct ListNode*)malloc(sizeof(struct ListNode));
greaterTail->next=lessTail->next=NULL;
while(pHead)
{
if(pHead->val<x)
{
lessTail->next=pHead;
lessTail=pHead;
}
else
{
greaterTail->next=pHead;
greaterTail=pHead;
}
pHead=pHead->next;
}
lessTail->next=greaterHead->next;
//最后一个节点的next置为NULL
greaterTail->next=NULL;
struct ListNode* list=lessHead->next;
free(lessHead);
free(greaterHead);
greaterHead=NULL;
lessHead=NULL;
return list;
}