ListNode链表结构超详细解析,LeetCode题解
LeetCode第二題兩數之和中,用到了ListNode這么一個結構。記錄下解題思路和步驟。
ListNode結構:
ListNode是一個鏈表結構,首先我們要知道鏈表是什么。
鏈表是由數據+指針構造而成的,指針指向下一個節點的數據。如下圖:
所以我們在定義ListNode結構的時候,就需要定義兩個屬性,一個是當前節點的值,一個是下一個節點的ListNode類型的值,用來實現指針的功能。
class ListNode{int val; //數據ListNode next; //指向下一個節點的數據 }可以加上構造函數:
class ListNode{int val;ListNode next;ListNode(int x) { val = x; }ListNode(int x, ListNode y) { val = x; next = y; } }假如說要定義[2, 4, 6]這么一個鏈表,也可以這么賦值,這樣我感覺會更清晰的理解到鏈表的結構。
ListNode l1 = new ListNode(2, new ListNode(4, new ListNode(6)));題解:
清楚鏈表的結構后,回到題目上。原題如下:
題目的意思是,兩個鏈表的數字都是按照逆序方式存儲。
2->4->3,對應的數字是342;5->6->4,對應的數字是465。相加得出807,對應的鏈表是7->0->8。
所以,如果兩個鏈表直接相加,得出來的數其實是不對的。這里存在一個滿十進位的問題。正確的操作應該是,鏈表相同位置的值相加后再加上前一節點進位的數,?% 10得出本節點的數,? 10得出進位數。如果加到最后一個節點,發現進位數>0,那么需要在鏈表的尾部追加進位數。
如果兩個鏈表長度不一致,那么缺少的數可以視為0。
舉個🌰:
以題中兩個鏈表為例,第一位2 + 5?+?上一節點進位數 = 7,7 /?10 = 0 進位數為0;7 % 10 = 7,??頭部節點為7。
第二位4 + 6 + 上一節點的進位數 = 10,10 / 10 = 1,進位數為1;10 % 10 = 0? ,本節點數為?0。
第三位3 + 4 + 上一節點的進位數1 = 7,7 / 10 = 0,進位數為0;7 % 10 = 7 ,本節點數為8。
結果值為7->0->8
再舉個🌰:
[9,9,9]和[9,9]兩個鏈表相加
第一位9 + 9 +上一節點的進位數= 18,18 / 10 = 1,進位數= 1;18 % 10 = 8? 本節點數= 8;
第二位9 + 9 + 上一節點進位數1 = 19, 19?/ 10 = 1,進位數=1;19?% 10 = 9 本節點數= 9;
第三位9 + 0 + 上一節點進位數1 = 10,10?/ 10 = 1,進位數=1;10 % 10? = 0 本節點數 = 0;
注意這個地方最后一個節點計算完畢,進位數>0 ,所以需要再追加一位。結果值應該是8->9->0->1。
步驟:
下面就可以解題了,先捋一下解題的步驟:
附上代碼:
每一步都有注釋解析。
class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {ListNode curr = null; //循環中動態賦值的鏈表ListNode head = null; //頭部信息,也可以理解為最終的結果值int s = 0; //初始的進位數//循環遍歷兩個鏈表while(l1 != null || l2 != null){//取值int num1 = l1 != null ? l1.val : 0;int num2 = l2 != null ? l2.val : 0;//兩個值相加,加上上一次計算的進位數int sum = num1 + num2 + s;//本次計算的進位數s = sum / 10;//本次計算的個位數int result = sum % 10;//給鏈表賦值//判斷鏈表頭部是否為空if(curr == null){//先給curr鏈表賦值curr = new ListNode(result);//指定head = curr,后續curr指向next節點重置節點信息時,head不會被重置head = curr;}else{//頭部不為空,指定next節點信息curr.next = new ListNode(result);//curr鏈表向后移,為了下一次循環繼續給next節點賦值curr = curr.next;}//同理,l1和l2鏈表向后移,獲取下一節點信息if(l1 != null){l1 = l1.next;}if(l2 != null){l2 = l2.next;}}//循環結束后判斷進位數if(s > 0) curr.next = new ListNode(s);//這里需要注意,是返回head鏈表,而不是curr。//curr因為上面每次循環時,做了指針后移操作curr = curr.next;//如果返回curr,是最后一次循環的值,而不是全部鏈表。return head;} }結束。
總結
以上是生活随笔為你收集整理的ListNode链表结构超详细解析,LeetCode题解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 16位44.1K的纯WAV播放器实现(模
- 下一篇: 【工具】Gif录像软件录制录屏(Scre