1.合并升序链表
思路:
新建指针变量保存两个链表的头指针,原因是防止遍历的时候它指向的数据被改变
再新建新链表的两个头指针,一个用来遍历,一个不变用来最后返回
遍历两个链表进行数据比较 ,小的放到新的链表里,链表向后走,比较到其中一个链表遍历结束(链表为空即为结束)
然后把没遍历完的那个链表直接接到新链表之后
#include<string.h>
#include<malloc.h>
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
};
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
ListNode* p;
ListNode* tmp;
ListNode* p1 = pHead1;
ListNode* p2 = pHead2;
tmp = (ListNode*)malloc(sizeof(ListNode));
p = tmp;
if (pHead1 == NULL){
return pHead2;
}
if (pHead2 == NULL){
return pHead1;
}
while (p1 && p2){
if (p1->val < p2->val){
tmp->next = p1;
p1 = p1->next;
}
else{
tmp->next = p2;
p2 = p2->next;
}
tmp = tmp->next;
}
if (p1){
tmp->next = p1;
}
if (p2){
tmp->next = p2;
}
return p->next;
}
2.找链表倒数第k个数
思路:
用两个指针,开始都指向链表的头,然后一个开始遍历走k步(while(k)即可),这时候第二个指针开始走,当第一个走到尾巴(为空)时,第二个此时的位置即为倒数第k个,返回第二个即可
#include<string.h>
struct ListNode {
int val;
struct ListNode *next;
};
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
ListNode* p1 = pListHead;
ListNode* p2 = pListHead;
while (k){
if (p1 == NULL)
return NULL;
p1 = p1->next;
k--;
}
while (p1 != NULL){
p1 = p1->next;
p2 = p2->next;
}
return p2;
}
3.复杂链表的复制
思路:
复制复杂链表的关键就是random指针域的复制
首先给新节点开辟空间 ret保存头结点
然后复制复杂链表的数据域和next指针域(遍历复制),
最后就是复制random指针域,复制random指针域时,新建两个指针用来遍历链表,一个指针用来寻找random指向哪里,另一个用来复制
#include<string.h>
#include<malloc.h>
struct RandomListNode {
int label;
struct RandomListNode *next, *random;//next指向下一节点,random指向任意节点
RandomListNode(int x) :
label(x), next(NULL), random(NULL) {
}
};
RandomListNode* Clone(RandomListNode* pHead)
{
RandomListNode* pHead1 = pHead;
RandomListNode* pHead2 = NULL;
RandomListNode* tmp1 = NULL;
RandomListNode* tmp2 = NULL;
RandomListNode* ret = NULL;
ret = tmp1 = (RandomListNode*)malloc(sizeof(RandomListNode));
if (pHead == NULL)
return NULL;
else{
tmp1->label = pHead->label;
tmp1->next = NULL;
tmp1->random = NULL;
pHead1 = pHead1->next;
}
while (pHead1 != NULL){
tmp1->next = (RandomListNode*)malloc(sizeof(RandomListNode));
tmp1 = tmp1->next;
tmp1->label = pHead1->label;
tmp1->next = NULL;
tmp1->random = NULL;
pHead1 = pHead1->next;
}
tmp1 = ret;
pHead1 = pHead;
while (pHead1 != NULL){
if (pHead1 != NULL){
pHead2 = pHead;
tmp2 = ret;
while (pHead2 != NULL){
if (pHead1->random == pHead2){
tmp1->random = tmp2;
break;
}
pHead2 = pHead2->next;
tmp2 = tmp2->next;
}
}
pHead1 = pHead1->next;
tmp1 = tmp1->next;
}
return ret;
}