LeetCode探索中級[両数加算][パリティチェーンテーブル][交差チェーンテーブル]
5586 ワード
チェーンテーブル
@[チェーンテーブル|ダブルポインタ]
チェーンテーブルの問題は比較的把握しやすい.配列の問題だけでなく、チェーンテーブルの問題にも適した「ダブルポインタ解法」を忘れないでください.
もう1つのリンクリストの問題を大幅に簡略化する方法は「Dummy node」ノードテクニックであり,Dummy Nodeとは実際には先頭ノードのポインタである.
1.両数加算
2つの非負の整数を表す2つの非空のチェーンテーブルが与えられる.ビット数は逆順序で格納され、各ノードには単一の数値しか格納されません.2つの数を加算して新しいチェーンテーブルを返します.数字0以外の2つの数字はゼロで始まると仮定できます.例:
入力:(2->4->3)+(5->6->4)出力:7->0->8理由:342+465=807
大体の考え方は 1 head指向ヘッダを定義し、last指向テール 2 firstタグの最初の遍歴を定義し、nextタグが現在10, より大きいかどうか、および3は、2つのチェーンテーブルが空の を指すまで2つのチェーンテーブルを巡回する.4最終判断nextが真lastがListNode(1) を指す場合5はhead に戻る
2.パリティチェーンテーブル
単一チェーンテーブルを指定し、すべての奇数ノードと偶数ノードをそれぞれ並べます.ここで、奇数ノードと偶数ノードは、ノードの値のパリティではなく、ノード番号のパリティを指すことに注意してください.その場のアルゴリズムで完了してみてください.あなたのアルゴリズムの空間複雑度はO(1)、時間複雑度はO(nodes)、nodesはノードの総数です.
例1:入力:1->2->3->4->5->NULL出力:1->3->5->2->4->NULL
例2:入力:2->1->3->5->6->4->7->NULL出力:2->3->6->7->1->5->4->NULL
説明:奇数ノードと偶数ノードの相対順序を維持する必要があります.チェーンテーブルの最初のノードは奇数ノードとみなされ、2番目のノードは偶数ノードとみなされます.
大体の考え方は 1はtempAが奇数チェーンテーブルを指し、tempBが偶数チェーンテーブル を指すことを定義する.2 headB指向tempBを定義する後、奇数チェーンテーブルの末尾指向双鎖テーブルのヘッダ を容易に巡回する. 3チェーンテーブルが空の2つのチェーンテーブルに割り当てられるまでチェーンテーブルを巡回する .4最後にtempBを使用する.nextは空を指し、tempA.nextはheadB を指す5はhead に戻る
3.交差チェーンテーブル
2つの単一チェーンテーブルが交差する開始ノードを見つけるプログラムを作成します.たとえば、次の2つのチェーンテーブルがあります.
A: ........a1 → a2 ........................↘ ..........................c1 → c2 → c3 ........................↗ B:b 1→b 2→b 3はノードc 1で交差し始める.
注意:1両チェーンテーブルに交点がない場合nullを返す. 2結果が返された後も、2つのチェーンテーブルは元の構造を維持しなければならない. 3は、チェーンテーブル構造全体にループがないと仮定することができる. 4プログラムは、O(n)時間の複雑さをできるだけ満たし、O(1)メモリのみを使用する.
大体の考え方ははlenAを定義し、lenBは2つのチェーンテーブル長 を表す.2定義listは、2つのうち長いチェーンテーブル を表す.3リストを後ろに行かせますabs(lenA-lenB)ステップ 4はlist 2が短いチェーンテーブルを指すことを定義し、同時に2つのチェーンテーブル を遍歴する.5ループ中のlistがlist 2に等しい場合、listを返します.そうでない場合、head を返します.
まとめチェーンテーブルの問題では、二重ポインタの問題 によく遭遇する.チェーンテーブルにおける注意判定空ポインタ フィードバックと提案 QQ:[3441242166] メールボックス:[email protected]
@[チェーンテーブル|ダブルポインタ]
チェーンテーブルの問題は比較的把握しやすい.配列の問題だけでなく、チェーンテーブルの問題にも適した「ダブルポインタ解法」を忘れないでください.
もう1つのリンクリストの問題を大幅に簡略化する方法は「Dummy node」ノードテクニックであり,Dummy Nodeとは実際には先頭ノードのポインタである.
1.両数加算
2つの非負の整数を表す2つの非空のチェーンテーブルが与えられる.ビット数は逆順序で格納され、各ノードには単一の数値しか格納されません.2つの数を加算して新しいチェーンテーブルを返します.数字0以外の2つの数字はゼロで始まると仮定できます.例:
入力:(2->4->3)+(5->6->4)出力:7->0->8理由:342+465=807
大体の考え方は
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode head ,last = new ListNode(0);
ListNode listNode;
head = last.next;
boolean first = true;
int sum;
boolean next = false;
while (l1!=null || l2!=null){
listNode = new ListNode(0);
if(next){
if(l1 == null){
sum = l2.val + 1;
}else if(l2 == null){
sum = l1.val + 1;
}else {
sum = l1.val + l2.val + 1;
}
}else {
if(l1 == null){
sum = l2.val;
}else if(l2 == null){
sum = l1.val;
}else {
sum = l1.val + l2.val;
}
}
if(sum>9){
listNode.val = sum%10;
next = true;
}else{
listNode.val = sum;
next = false;
}
if(first){
head = listNode;
first = false;
}
last.next = listNode;
last = last.next;
if(l1!=null)
l1 = l1.next;
if(l2!=null)
l2 = l2.next;
}
if(next){
last.next = new ListNode(1);
}
return head;
}
}
2.パリティチェーンテーブル
単一チェーンテーブルを指定し、すべての奇数ノードと偶数ノードをそれぞれ並べます.ここで、奇数ノードと偶数ノードは、ノードの値のパリティではなく、ノード番号のパリティを指すことに注意してください.その場のアルゴリズムで完了してみてください.あなたのアルゴリズムの空間複雑度はO(1)、時間複雑度はO(nodes)、nodesはノードの総数です.
例1:入力:1->2->3->4->5->NULL出力:1->3->5->2->4->NULL
例2:入力:2->1->3->5->6->4->7->NULL出力:2->3->6->7->1->5->4->NULL
説明:奇数ノードと偶数ノードの相対順序を維持する必要があります.チェーンテーブルの最初のノードは奇数ノードとみなされ、2番目のノードは偶数ノードとみなされます.
大体の考え方は
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode oddEvenList(ListNode head) {
if(head ==null || head.next == null){
return head;
}
ListNode tempA = head;
ListNode tempB = head.next;
ListNode headB = tempB;
int x = 0;
for(ListNode temp = head.next.next;temp!=null;temp = temp.next){
if(x%2==0){
tempA.next = temp;
tempA = tempA.next;
}else{
tempB.next = temp;
tempB = tempB.next;
}
x++;
}
tempB.next = null;
tempA.next = headB;
return head;
}
}
3.交差チェーンテーブル
2つの単一チェーンテーブルが交差する開始ノードを見つけるプログラムを作成します.たとえば、次の2つのチェーンテーブルがあります.
A: ........a1 → a2 ........................↘ ..........................c1 → c2 → c3 ........................↗ B:b 1→b 2→b 3はノードc 1で交差し始める.
注意:
大体の考え方は
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA==null && headB==null){
return null;
}
int lenA = 0;
int lenB = 0;
for(ListNode temp = headA;temp!=null;temp = temp.next){
lenA++;
}
for(ListNode temp = headB;temp!=null;temp = temp.next){
lenB++;
}
boolean isA = lenA>lenB?true:false;
ListNode list = isA?headA:headB;
for(int x = 0; x
まとめ