1. 程式人生 > >LeetCode.142 環形連結串列 II

LeetCode.142 環形連結串列 II

問題描述
給定一個連結串列,返回連結串列開始入環的第一個節點。 如果連結串列無環,則返回 null。

說明:不允許修改給定的連結串列。

進階:
你是否可以不用額外空間解決此題?

主要不能使用額外空間較為困難,先判斷環,之後找到相遇點,將其中一個指標指向頭結點,兩指標同時走,相遇即為環入口。

推導過程為 :設開頭到相遇點的距離為a,開頭到入口的距離為b,相遇點到入口的向右距離為c,則有公式 a+c+a-b=2a 快指標走的距離為慢指標的兩倍。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next
; * }; */ struct ListNode *detectCycle(struct ListNode *head) { struct ListNode * t; struct ListNode * t2; t=head; t2=head; while(t2!=NULL){ if(t2->next!=NULL){ t2=t2->next; if(t2->next!=NULL){ t2=t2->next; t=t->next
; if(t==t2){ t=head; if(t==t2){ return t2; } while(t!=t2){ t=t->next; t2=t2->next; if(t==t2){ return
t2; } } } continue; } else{ return NULL; } }else{ return NULL; } } return NULL; }