链接:https://leetcode-cn.com/explore/learn/card/linked-list/197/conclusion/764/
思路:顺着child结点链接链表前部分,将child后面的部分按顺序链起来,遍历完原链表之后,再将两部分整合。
代码:
/*
// Definition for a Node.
class Node {
public:
int val;
Node* prev;
Node* next;
Node* child;
};
*/
class Solution {
public:
Node* flatten(Node* head) {
if(head==NULL) return NULL;
Node *p=head;
Node *l=NULL;
while(p)
{
if(p->child)
{
Node *n=p;
while(n->next)
{
n=n->next;
}
if(l)
{
n->next=l;
l->prev=n;
}
if(p->next)
{
l=p->next;
l->prev=NULL;
}
p->next=p->child;
p->child->prev=p;
p->child=NULL;
}
if(p->next) p=p->next;
else break;
}
p->next=l;
if(l) {l->prev=p;}
return head;
}
};
其他方法详解:https://leetcode-cn.com/problems/flatten-a-multilevel-doubly-linked-list/solution/bian-ping-hua-duo-ji-shuang-xiang-lian-biao-by-lee/