合并两个有序链表
首先看题目描述:
当看完题目后,我们知道实现两链表的合并不可能在原链表中完成,所以我们需要新建链表,通过对原先两链表之间各个节点的比较依次将节点尾插在新建的链表中,最后返回新节点即可。图示如下:
需要注意的是,当两链表中有一个链表已经走到尾结点,那么证明另一个链表中的剩下的节点的值都是比走结束的那个链表中的节点值要大,所以最后还需将这些剩下的节点都尾插到新链表中。
代码实现如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
if(l1==NULL)
return l2;
if(l2==NULL)
return l1;
struct ListNode*newhead=NULL;
struct ListNode*tail=NULL;
struct ListNode*n1=l1;
struct ListNode*n2=l2;
while(n1 && n2)
{
if(n1->val < n2->val)
{
if(tail==NULL)
{
newhead=tail=n1;
}
else
{
tail->next=n1;
tail=n1;
}
n1=n1->next;
}
else
{
if(tail==NULL)
{
newhead=tail=n2;
}
else
{
tail->next=n2;
tail=n2;
}
n2=n2->next;
}
}
if(n1)
tail->next=n1;
if(n2)
tail->next=n2;
return newhead;
}
链表分割
思路:首先需要定义两段新链表,一段链表(定义为 lessHead )用来保存值小于 x 的节点,另一段链表(定义为 greaterHead )用来保存值不小于 x 的节点;然后再对原先的链表进行遍历,值小于 x 的节点尾插到 lessHead 中,值不小于 x 的节点尾插到 greaterHead 中;最后在将 greaterHead 尾插到 lessHead 中就OK,实现如下:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
ListNode* partition(ListNode* pHead, int x) {
// write code here
ListNode*lessHead,*greaterHead,*lessTail,*greaterTail;
lessHead=lessTail=(ListNode*)malloc(sizeof(ListNode));
greaterHead=greaterTail=(ListNode*)malloc(sizeof(ListNode));
ListNode*cur=pHead;
while(cur)
{
if(cur->val<x) //若val比x小,则尾插到lessTail中
{
lessTail->next=cur;
lessTail=cur;
}
else
{
greaterTail->next=cur; //若val不比x小,则尾插到greaterTail中
greaterTail=cur;
}
cur=cur->next;
}
lessTail->next=greaterHead->next; //因为greaterHead是malloc出来的,所以注意是将原先链表
//中的节点中尾插到lessTail后
greaterTail->next=NULL;
ListNode*newhead=lessHead->next; //定义新的头节点为lessHead的后一个节点,这样才能保
//证返回的是原本链表中的节点
free(lessHead); //动态申请的空间注意最后要释放
free(greaterHead); //同上
return newhead;
}