链表双指针技巧汇总 [labuladong-刷题打卡 day1]
双指针链表合并
比较简单的双指针比较算法,两个指针分别指向待合并链表/序列,比较后选择符合条件的指针移动
Trick:链表在实现时,带头节点的链表在操作中更方便
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
ListNode *head= new ListNode();
ListNode *p=list1,*q=list2,*temp=head;
while(p&&q){
if(p->val>=q->val){
temp->next=q;
q=q->next;
}else{
temp->next=p;
p=p->next;
}
temp=temp->next;
}
if(p) temp->next=p;
else temp->next=q;
return head->next;
}
};
双指针链表分解
双指针分别维护两个链表
一开始链表最后节点没设置为空,有溢出的情况,因为有可能小数链表最后会链接到大数链表,但大数链表没有更改可能还指向小数链表中的某个节点造成环路。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
ListNode *head1=new ListNode(),*head2=new ListNode();
ListNode *p=head1,*q=head2;
while(head){
if(x>head->val){
p->next=head;
p=p->next;
}else{
q->next=head;
q=q->next;
}
head=head->next;
}
p->next=head2->next;
q->next=nullptr;
return head1->next;
}
};
本文来自博客园,作者:Alan-Blog,转载请注明原文链接:https://www.cnblogs.com/alanjiang/p/17595950.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步